Multi-Version Concurrency Control (MVCC) হল একটি ডেটাবেজের ট্রানজেকশন পরিচালনার একটি পদ্ধতি, যা একাধিক ট্রানজেকশনকে একই সময়ে ডেটাবেজে কাজ করতে দেয়, কিন্তু প্রতিটি ট্রানজেকশনকে তাদের নিজস্ব সংস্করণ (version) দেয়। এটি ডেটাবেজের স্বচ্ছতা, ডেটার একসাথে ব্যবহার এবং লকিং সমস্যা সমাধান করতে সহায়ক। H2 Database MVCC ব্যবহার করে যাতে একাধিক ট্রানজেকশন একে অপরকে প্রভাবিত না করে কাজ করতে পারে।
MVCC বিশেষভাবে গুরুত্বপূর্ণ কারণ এটি ডেটাবেজের পারফরম্যান্স বৃদ্ধি করতে সাহায্য করে, বিশেষ করে যখন একাধিক ইউজার বা প্রোগ্রাম একই সময়ে ডেটাবেজ অ্যাক্সেস করতে চেষ্টা করে। এটি লকিং ছাড়াই একাধিক ট্রানজেকশনের মধ্যে ডেটা অ্যাক্সেস সমর্থন করে।
H2 Database-এ MVCC এমনভাবে কাজ করে যে প্রতিটি ট্রানজেকশন যখন কোনো ডেটা পড়ে (read) বা লিখে (write), তখন এটি ডেটার একটি পৃথক সংস্করণ তৈরি করে। এই সংস্করণগুলো একে অপরের থেকে বিচ্ছিন্ন থাকে, যাতে একাধিক ট্রানজেকশন একই ডেটাতে একযোগভাবে কাজ করতে পারে। এতে কোনো ট্রানজেকশন অন্যের ট্রানজেকশনকে প্রভাবিত করতে পারে না, ফলে data consistency এবং isolation নিশ্চিত হয়।
MVCC এর মাধ্যমে একাধিক ট্রানজেকশন একে অপরকে ব্লক না করে দ্রুত ডেটাবেজের সাথে কাজ করতে পারে। এটি ট্রানজেকশনাল পারফরম্যান্স বাড়ায়, বিশেষত যখন অনেক ইউজার বা ক্লায়েন্ট একে অপরকে বিরক্ত না করে ডেটাবেজ অ্যাক্সেস করছে।
MVCC ডেটার বিভিন্ন সংস্করণ তৈরি করে, ফলে একাধিক ইউজার একই ডেটাতে একযোগে কাজ করতে পারে, এবং একটি ট্রানজেকশন অন্যটির ফলাফল প্রভাবিত করতে পারে না।
MVCC ব্যবহার করার ফলে lock contention বা deadlock সমস্যা হয় না, কারণ একাধিক ট্রানজেকশন একই ডেটাতে কাজ করতে পারে না এবং তাদের নিজস্ব সংস্করণ ব্যবহার করতে পারে।
MVCC ডেটাবেজে একাধিক ট্রানজেকশন তাদের নিজস্ব commit এবং rollback ক্রিয়া করতে পারে, যাতে ডেটা সর্বদা এককীকৃত এবং সঠিক থাকে।
MVCC ডেটাবেজে বিভিন্ন সংস্করণ সঞ্চিত রাখে, যার ফলে ডেটাবেজের আকার বড় হতে পারে, বিশেষ করে দীর্ঘ সময় ধরে চলমান ট্রানজেকশনগুলির ক্ষেত্রে।
যদি একটি ট্রানজেকশন একটি ডেটা পরিবর্তন করে এবং অন্য একটি ট্রানজেকশন সেই একই ডেটার একটি পুরনো সংস্করণ পড়ে, তখন কিছু ক্ষেত্রে dirty read হতে পারে। যদিও H2 তে এই সমস্যা সমাধানে অনেক সুরক্ষা ব্যবস্থা রয়েছে, তবে এটি একটি সমস্যা হতে পারে।
H2 Database-এ MVCC সঠিকভাবে কাজ করতে, আপনাকে কিছু কনফিগারেশন করতে হতে পারে, যেমন transaction isolation level কনফিগারেশন। সাধারণত, READ COMMITTED বা SERIALIZABLE লেভেল ব্যবহার করা হয়।
SET TRANSACTION ISOLATION LEVEL READ_COMMITTED;
এটি MVCC এর সুবিধা নিশ্চিত করে, কারণ এতে dirty reads প্রতিরোধ হয় এবং প্রতিটি ট্রানজেকশন সঠিকভাবে কার্যকর হয়।
ধরা যাক, একটি orders
নামক টেবিল রয়েছে, যেখানে অনেক ট্রানজেকশন ডেটা যোগ বা পরিবর্তন করছে। দুইটি ট্রানজেকশন একসঙ্গে একই রেকর্ড আপডেট করার চেষ্টা করলে:
status
পরিবর্তন করবে।price
আপডেট করবে।MVCC নিশ্চিত করবে যে, যদিও দুটি ট্রানজেকশন একই রেকর্ডে কাজ করছে, তবে তারা তাদের নিজস্ব ভার্চুয়াল সংস্করণ তৈরি করবে, যাতে data integrity বজায় থাকে।
H2 Database এর Multi-Version Concurrency Control (MVCC) ডেটাবেজের স্বচ্ছতা, পারফরম্যান্স, এবং ডেটা একসাথে ব্যবহারের জন্য একটি গুরুত্বপূর্ণ প্রযুক্তি। এটি একাধিক ট্রানজেকশনকে একই সময়ে ডেটাবেজে কাজ করতে সহায়তা করে, লকিং সমস্যা এড়ানো এবং ডেটা consistency নিশ্চিত করে। H2 Database-এর MVCC এর মাধ্যমে কম পারফরম্যান্স খরচ, কমপ্লেক্স ট্রানজেকশন অপারেশন এবং ডেটা নিরাপত্তা নিশ্চিত করা যায়।
Multi-Version Concurrency Control (MVCC) হল একটি ডেটাবেজের কনকারেন্ট অ্যাক্সেস কন্ট্রোল মেকানিজম যা একই সময়ে একাধিক ব্যবহারকারী বা থ্রেডের মধ্যে ডেটাবেজে একাধিক অপারেশন চালানোর সুযোগ দেয়, এবং সেগুলোর মধ্যে কনফ্লিক্ট এড়িয়ে কাজ করতে সহায়ক। MVCC-কে সাধারণত ডেটাবেজের কনকারেন্সি এবং ইসোলেশন স্তরের উন্নতির জন্য ব্যবহৃত হয়।
H2 Database, PostgreSQL, MySQL-এর InnoDB ইঞ্জিন এবং অন্যান্য বেশ কিছু ডেটাবেজ সিস্টেম MVCC সমর্থন করে, যা ডেটাবেজের পারফরম্যান্স বৃদ্ধি করে এবং লকিংয়ের মাধ্যমে ডেটার অ্যাক্সেসের সীমাবদ্ধতা কমায়।
MVCC ব্যবহার করে, ডেটাবেজ সিস্টেম একটি বহু সংস্করণ (Multiple Versions) তৈরি করে, যেখানে প্রতিটি রেকর্ডের একাধিক সংস্করণ থাকে। প্রতিটি রেকর্ড বা টেবিলের সংস্করণ নির্ধারণ করা হয় টাইমস্ট্যাম্প বা ট্রানজ্যাকশন আইডি দ্বারা। এর ফলে, বিভিন্ন ইউজার বা ট্রানজ্যাকশন একই ডেটার উপর একাধিক অপারেশন করতে পারে এবং একে অপরকে প্রভাবিত না করে কাজ করতে পারে।
MVCC প্রক্রিয়াতে প্রধানত দুটি পদ্ধতি ব্যবহৃত হয়:
ধরা যাক, একটি users
টেবিল রয়েছে, এবং দুটি ট্রানজ্যাকশন (T1 এবং T2) একই রেকর্ড আপডেট করতে চায়।
UPDATE users SET name = 'Alice' WHERE id = 1;
— T1 একটি রেকর্ড আপডেট করেছে।SELECT name FROM users WHERE id = 1;
— T2 একই রেকর্ডটি পড়ে এবং এটি পুরানো মান (যেমন "Bob") পায়, কারণ T1 এখনও ডেটাবেজের মধ্যে তার পরিবর্তনটি সম্পন্ন করেনি।এখানে, T1 এবং T2 কোনো ধরনের কনফ্লিক্ট সৃষ্টি না করে তাদের কাজ সম্পন্ন করতে পারছে, কারণ T2 শুধুমাত্র পুরানো সংস্করণ দেখতে পাচ্ছে।
UPDATE users SET name = 'Alice' WHERE id = 1;
UPDATE users SET name = 'Bob' WHERE id = 1;
এখানে, T1 এবং T2 একে অপরকে ব্লক না করেই ডেটা পরিবর্তন করতে পারে। কিন্তু, T2 যখন UPDATE
করার জন্য কাজ করবে, T1-এ পরিবর্তনগুলি লক না করেই দেখতে পাবে না। সুতরাং, এই প্রক্রিয়া শেষ হয়ে গেলে, দুইটি ভিন্ন সংস্করণ থাকবে।
H2 ডেটাবেজে, MVCC স্বয়ংক্রিয়ভাবে কাজ করে, যেখানে প্রতিটি ট্রানজ্যাকশন একটি আলাদা সংস্করণে ডেটা দেখতে পায় এবং অন্য ট্রানজ্যাকশনগুলি পরিবর্তন করতে গেলে, সেগুলোর জন্য আলাদা সংস্করণ তৈরি করা হয়। এটি ACID বৈশিষ্ট্য নিশ্চিত করতে সহায়ক।
যদিও MVCC একটি শক্তিশালী কনকারেন্সি কন্ট্রোল প্রযুক্তি, তবুও এর কিছু সীমাবদ্ধতা এবং চ্যালেঞ্জ রয়েছে:
MVCC (Multi-Version Concurrency Control) একটি অত্যন্ত কার্যকরী কনকারেন্সি কন্ট্রোল মেকানিজম, যা ডেটাবেজে একাধিক ট্রানজ্যাকশনকে একই সময়ে ডেটার উপর কাজ করার সুযোগ দেয় এবং ডেটা ইনটিগ্রিটি ও পারফরম্যান্স নিশ্চিত করে। H2 ডেটাবেজে MVCC সিস্টেম ব্যবহার করে লকিং কমানো হয়, যার ফলে একাধিক ব্যবহারকারী বা অ্যাপ্লিকেশন একযোগে ডেটাবেজে কাজ করতে পারে।
H2 Database এর Concurrency এবং Lock Management অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন একাধিক ট্রানজাকশন একই সময়ে ডেটাবেজে কাজ করে। Concurrency management নিশ্চিত করে যে একাধিক ট্রানজাকশন সমান্তরালভাবে কার্যকরীভাবে চলতে পারে, এবং Lock management এটি নিশ্চিত করে যে একাধিক ট্রানজাকশন একই ডেটা পরিবর্তন না করে।
H2 ডেটাবেজে Concurrency এবং Locking এর মাধ্যমে ডেটাবেজের বিভিন্ন রেকর্ডের ওপর একাধিক ট্রানজাকশন নিরাপদভাবে কাজ করতে পারে। এই পদ্ধতিটি ACID (Atomicity, Consistency, Isolation, Durability) প্রপার্টিজ নিশ্চিত করতে সাহায্য করে।
Concurrency হল একাধিক ট্রানজাকশন একে অপরের সাথে সমান্তরালভাবে কাজ করা, যখন ডেটাবেজে বিভিন্ন রেকর্ড একাধিক ট্রানজাকশন দ্বারা অ্যাক্সেস করা হয়। H2 ডেটাবেজে concurrency management নিশ্চিত করতে Isolation Levels এবং Locking Mechanisms ব্যবহার করা হয়।
Locking হল একটি প্রক্রিয়া যা একাধিক ট্রানজাকশন একসাথে একই ডেটা অ্যাক্সেস করতে বাধা দেয়। H2 ডেটাবেজে Row-level Locking এবং Table-level Locking দুই ধরনের lock management ব্যবহৃত হয়।
H2 ডেটাবেজে বিভিন্ন Isolation Levels রয়েছে, যা ডেটার অ্যাক্সেসের পৃথকীকরণকে নিয়ন্ত্রণ করে। Isolation Levels নির্ধারণ করে ট্রানজাকশনগুলো একে অপরের কার্যক্রমের উপর কতটা প্রভাব ফেলতে পারে।
H2 এ Isolation Level পরিবর্তন করা:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
এটি ট্রানজাকশন চলাকালীন Serializable Isolation Level নির্ধারণ করবে, যাতে সমস্ত ট্রানজাকশন একে অপরের থেকে পৃথক থাকবে।
H2 ডেটাবেজে লক ব্যবস্থাপনা করতে দুই ধরনের লকিং ব্যবহার করা হয়:
এই পদ্ধতিতে, H2 ডেটাবেজ শুধুমাত্র সংশ্লিষ্ট রেকর্ডকে লক করে, যা কার্যকরীভাবে একাধিক ট্রানজাকশনকে একই সময়ে ভিন্ন ভিন্ন রেকর্ডে কাজ করার অনুমতি দেয়।
উদাহরণ:
যদি দুটি ট্রানজাকশন একে অপরের সাথে বিভিন্ন রেকর্ড আপডেট করার চেষ্টা করে, তবে Row-level Locking নিশ্চিত করবে যে তারা একে অপরকে বাধা না দেয়।
এই পদ্ধতিতে, যখন একটি ট্রানজাকশন একটি টেবিলের ওপর কাজ করে, তখন টেবিলটির সমস্ত রেকর্ডই লক হয়ে যায়। অন্য ট্রানজাকশন একই টেবিলের সাথে কাজ করতে পারবে না যতক্ষণ না প্রথম ট্রানজাকশন সম্পন্ন হয়।
ধরা যাক, একটি ট্রানজাকশন "User A" এর অ্যাকাউন্ট থেকে টাকা কেটে "User B" এর অ্যাকাউন্টে ট্রান্সফার করার চেষ্টা করছে। যদি একই সময়ে দুটি ট্রানজাকশন ঘটে, তবে H2-র Row-level Locking নিশ্চিত করবে যে এক ট্রানজাকশন অন্যটিকে ব্লক করবে না, এবং একই ডেটা পরিবর্তন করতে বাধা দেওয়া হবে।
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
এই কোডের মাধ্যমে, একক ট্রানজাকশন চালানো হচ্ছে, যেখানে Row-level Locking এই ডেটা পরিবর্তনের সময় নিশ্চিত করবে যে অন্য কোনো ট্রানজাকশন একই রেকর্ড পরিবর্তন করার চেষ্টা করছে না।
Deadlock তখন ঘটে যখন দুটি বা তার বেশি ট্রানজাকশন একে অপরকে ব্লক করে রাখে, এবং একটি ট্রানজাকশন কখনও শেষ হতে পারে না। H2 ডেটাবেজ deadlock detection এর মাধ্যমে এ ধরনের সমস্যার সমাধান করতে সক্ষম, এবং এতে rollback করে deadlock নিরসন করা হয়।
H2 ডেটাবেজে Concurrency এবং Lock Management কার্যকরীভাবে পরিচালনা করার জন্য Isolation Levels, Row-level Locking, এবং Table-level Locking ব্যবহৃত হয়। এই পদ্ধতিগুলি নিশ্চিত করে যে একাধিক ট্রানজাকশন নিরাপদ এবং স্বতন্ত্রভাবে কাজ করতে পারে, এবং ডেটাবেজে কোনো অসঙ্গতি বা দ্বন্দ্ব না ঘটে। H2 এর Locking ও Concurrency management-এর মাধ্যমে, ডেটাবেজের কার্যক্ষমতা এবং নিরাপত্তা একসাথে বজায় থাকে।
Optimistic Concurrency Control (OCC) একটি ডেটাবেজ ট্রানজেকশন ম্যানেজমেন্ট কৌশল যা মূলত ডেটা কনফ্লিক্ট বা লকিং ছাড়াই একাধিক ট্রানজেকশনকে সমান্তরালে চলতে দেয়। এই কৌশলে, প্রতিটি ট্রানজেকশন একটি ডেটা রেকর্ড পড়ে এবং একে পরিবর্তন করার চেষ্টা করে, তবে ট্রানজেকশন শেষ করার আগে অন্য কোনো ট্রানজেকশন যদি একই ডেটা পরিবর্তন করে, তবে প্রথম ট্রানজেকশনটি ব্যর্থ হয়ে যাবে এবং আবার চেষ্টা করতে হবে।
OCC বিশেষভাবে উপকারী যখন হাই কনকারেন্সি (High Concurrency) পরিবেশে কাজ করা হয়, যেখানে একাধিক ইউজার বা অ্যাপ্লিকেশন একযোগে ডেটাবেজ অ্যাক্সেস করে, তবে ডেটার সংঘর্ষ বা কনফ্লিক্ট কম থাকে।
OCC তিনটি প্রধান পর্যায়ে কাজ করে:
ব্যাংকিং অ্যাপ্লিকেশন:
OCC ব্যবহৃত হতে পারে ব্যাংকিং অ্যাপ্লিকেশনে, যেখানে একাধিক ট্রানজেকশন একসাথে একই অ্যাকাউন্টে পরিবর্তন করতে পারে, তবে একে অপরের সাথে সংঘর্ষ না হলে এটি কার্যকর হবে। উদাহরণস্বরূপ, দুটি ইউজার যদি একই অ্যাকাউন্ট থেকে টাকা তুলে, তবে OCC নিশ্চিত করবে যে প্রথম ট্রানজেকশন শেষ না হওয়া পর্যন্ত দ্বিতীয় ট্রানজেকশনটি সম্পন্ন হবে না।
ই-কমার্স সিস্টেম:
যদি একাধিক ইউজার একসাথে একই প্রোডাক্ট কেনার চেষ্টা করেন, তবে OCC তাদের মধ্যে কোনো কনফ্লিক্ট সৃষ্টি না করেই তাদের অর্ডার প্রক্রিয়া শেষ করতে পারে।
ধরা যাক, দুইজন ইউজার একই সময়ে একটি অ্যাকাউন্ট থেকে টাকা তুলে নেওয়ার চেষ্টা করছে:
এইভাবে, OCC Isolation নিশ্চিত করে এবং Concurrency সমস্যাগুলি সমাধান করতে সহায়ক।
Optimistic Concurrency Control (OCC) হল একটি শক্তিশালী কৌশল যা কম লকিং এবং ট্রানজেকশনগুলির মধ্যে কম সংঘর্ষের পরিস্থিতিতে অত্যন্ত কার্যকর। এটি উচ্চ পারফরম্যান্স এবং সহজ পরিচালনার সুবিধা প্রদান করে, তবে একাধিক ট্রানজেকশনের মধ্যে সংঘর্ষের সম্ভাবনা থাকলে কিছু চ্যালেঞ্জ সৃষ্টি হতে পারে।
common.read_more